package ArbreBinaire;

import linkTreeInterface.Word;

public class ArbreWord extends ArbreBinaireOrdonneChaine<Word>{
	//public ArbreBinaire<Word> a = ArbreBinaireChaine.arbreVide;
	
	/**
     * Rôle : construit une table vide 
     */
	public ArbreWord(){	
		this.a = ArbreBinaireChaine.arbreVide;
	}
	
	
/**
 *  Rôle : Ajouter en feuille dans l’arbre ordonné courant l’élément e * méthode, version récursive
 * @param a, l'arbre contenant tous les mots
 * @param mot, le mot de type Word à ajouter
 * @return l'arbre contenant tous les mots
 * @throws ArbreVideException
 */
	public ArbreBinaire<Word> ajouterEnFeuilleR(ArbreBinaire<Word> a, Word e) throws ArbreVideException{
		
		if (a.estVide()){
			a = new ArbreBinaireChaine<Word>(e);	
		}
		
		// a n’est pas vide
		else if (((Word) e).compare((Word)a.valeur())==0){
			new UserInterface.ErrorDialog("Le mot "+e.getWord()+" existe déjà dans le dictionnaire !"); 
			return a;
		}
		
		else if (((Word) e).compare((Word)a.valeur())<0){
		    // clé du noeud courant  >= e.clé
			// ajouter dans le sous−arbre gauche
			a.changerSag(ajouterEnFeuilleR(a.sag(), e));
		}
		else if(((Word) e).compare((Word)a.valeur())>0){
			// clé du noeud courant  < e.clé
			// ajouter dans le sous−arbre droit
			a.changerSad(ajouterEnFeuilleR(a.sad(), e));
		}
	return a;
	}
	

/**
 * Rôle : trouver un mot
 * @param a, l'arbre contenant tous les mots
 * @param mot, le mot dont on cherche la traduction
 * @return l'objet mot
 * @throws ArbreVideException
 */
    public Word findWord(ArbreBinaire<Word> a, String mot) throws ArbreVideException{
            
                    if (a.estVide()) return null;
            
                    // a n’est pas vide
                    else if (((Word) a.valeur()).compareMot(mot)==0) return a.valeur();
            
                    else if(((Word) a.valeur()).compareMot(mot)<0) return findWord(a.sad(), mot);
                    
                    else if (((Word) a.valeur()).compareMot(mot)>0) return findWord(a.sag(), mot);
                    
                    return null; 
                    }  
    
    
	
	/**
 * Rôle : trouver un mot
 * @param a, l'arbre contenant tous les mots
 * @param mot, le mot dont on cherche la traduction
 * @return l'objet mot
 * @throws ArbreVideException
 */
	public String findTrad(ArbreBinaire<Word> a, String mot) throws ArbreVideException{
		
			if (a.estVide()) return null;
		
			// a n’est pas vide
			else if (((Word) a.valeur()).compareMot(mot)==0) return a.valeur().getTrad();
		
			else if(((Word) a.valeur()).compareMot(mot)<0) return findTrad(a.sad(), mot);
			
			else if (((Word) a.valeur()).compareMot(mot)>0) return findTrad(a.sag(), mot);
			
			return null; 
			}	
	

/**
 * Rôle : trouver un mot avec expressions régulières
 * @param a, l'arbre contenant tous les mots
 * @param mot, l'epression regex dont on cherche la traduction
 * @return l'objet mot
 * @throws ArbreVideException
 */
	public String findTradRegex(ArbreBinaire<Word> a, String mot) throws ArbreVideException{
		
			if (a.estVide()) return "bla";
		
			// a n’est pas vide
			else if (((Word) a.valeur()).compareMotRegex(mot)) return a.valeur().getTrad()+System.getProperty("line.separator")+findTradRegex(a.sad(), mot)+findTradRegex(a.sag(), mot);
			else if (!((Word) a.valeur()).compareMotRegex(mot)) return findTradRegex(a.sad(), mot)+findTradRegex(a.sag(), mot);

			return null; 
			}	
	
	
/**
 * Rôle : editer la traduction d'un mot
 * @param a, l'arbre contenant tous les mots
 * @param mot, le mot dont qu'on cherche à éditer; 
 * @param trad, la nouvelle traduction
 * @throws ArbreVideException
 */
	public void editer(ArbreBinaire<Word> a, String mot, String trad) throws ArbreVideException{

			if (((Word) a.valeur()).compareMot(mot)==0){
				System.out.println(trad);
				a.valeur().edit(trad);
			}
		
			else if(((Word) a.valeur()).compareMot(mot)<0) editer(a.sad(), mot, trad);
			
			else if (((Word) a.valeur()).compareMot(mot)>0) editer(a.sag(), mot, trad);
	}
	
 /**
  * 	
  * @param a, l'arbre contenant tous les mots 
  * @param mot, le mot à supprimer
  * @return
  * @throws ArbreVideException
  */
	public   ArbreBinaire delete(ArbreBinaire a, Word word) throws ArbreVideException {
		if(!a.estVide()){
			if (((Word)word).compare((Word)(a.valeur()))<0){
				a.changerSag(delete(a.sag(), word));
			}
			else{
				if(((Word)word).compare((Word)(a.valeur()))>0){
					a.changerSad(delete(a.sad(), word));
				}else{//l'Ã©lÃ©ment est trouvÃ©
					if(a.sad().estVide()){//a=sag
						a=a.sag();
					}
					else if(a.sag().estVide()){//a=sad
							a=a.sad();
					}else{//a possÃ¨de deux sous arbre non vides dont a 
						ArbreBinaire<Word> b=a.sag();
						while(!b.sad().estVide()){
							b=b.sad();
						}
						delete(b.sag(),b.valeur());
						a.valeur(b.valeur());	
					}
				}
			}
		}
		return a;

	}
		
}
